package com.shortLinked.project.service.impl;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.shortLinked.project.common.constant.RedisKeyConstant;
import com.shortLinked.project.dao.entity.ShortLinkDO;
import com.shortLinked.project.dao.mapper.ShortLinkMapper;
import com.shortLinked.project.dto.req.RecoverRecycleBinReqDTO;
import com.shortLinked.project.dto.req.RecycleBinReqDTO;
import com.shortLinked.project.dto.req.RemoveRecycleBinReqDTO;
import com.shortLinked.project.dto.req.ShortLinkRecycleBinPageReqDTO;
import com.shortLinked.project.dto.resp.ShortLinkPageRespDTO;
import com.shortLinked.project.service.RecycleBinService;
import lombok.RequiredArgsConstructor;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import static com.shortLinked.project.common.constant.ColoredOutput.RED;
import static com.shortLinked.project.common.constant.ColoredOutput.RESET;

/**
 * 短链接回收站接口实现层
 */
@Service
@RequiredArgsConstructor
public class RecycleBinServiceImpl extends ServiceImpl<ShortLinkMapper, ShortLinkDO> implements RecycleBinService {

    private final StringRedisTemplate stringRedisTemplate;

    @Override
    public void saveRecycleBin(RecycleBinReqDTO requestParam) {
        //传入fullshortlink和gid
        System.out.println(RED+"这里是:saveRecycleBin"+RESET);
        LambdaUpdateWrapper<ShortLinkDO> updateWrapper = Wrappers.lambdaUpdate(ShortLinkDO.class)
                .eq(ShortLinkDO::getGid, requestParam.getGid())
                .eq(ShortLinkDO::getFullShortUrl, requestParam.getFullShortUrl())
                .eq(ShortLinkDO::getEnableStatus, 0)
                .eq(ShortLinkDO::getDelFlag, 0);
        ShortLinkDO shortLinkDO = ShortLinkDO.builder()
                .enableStatus(1)
                .build();
        //使用构建器模式构建一个 ShortLinkDO 对象，设置其 enableStatus 为 1，表示该短链接将被标记为已删除（或不可用）
        baseMapper.update(shortLinkDO, updateWrapper);
        //执行数据库更新操作，将符合 updateWrapper 条件的记录的 enableStatus 更新为 1，即表示该短链接被禁用
        stringRedisTemplate.delete(String.format(RedisKeyConstant.GOTO_SHORT_LINK_KEY, requestParam.getFullShortUrl()));
        // "short-link:goto:%s"
        // 删除缓存中的原始链接
    }

    @Override
    public IPage<ShortLinkPageRespDTO> pageRecycleBinShortlink(ShortLinkRecycleBinPageReqDTO requestParam) {
        //处理回收站中短链接的分页查询请求
        //ShortLinkRecycleBinPageReqDTO(gidList=[lKgAH1, 8mP9aZ, f5v5c7, 2zhTq8, RWjECJ])传入gid集合
        System.out.println(RED+"这里是:pageRecycleBinShortlink"+RESET);
        IPage<ShortLinkDO> resultPage = baseMapper.pageRecycleBinLink(requestParam);
        return resultPage.convert(each -> {
            // 添加域名
            ShortLinkPageRespDTO shortLinkPageRespDTO = BeanUtil.toBean(each, ShortLinkPageRespDTO.class);
            //result的每一项数据转换为ShortLinkPageRespDTO
            shortLinkPageRespDTO.setDomain("http://" + shortLinkPageRespDTO.getDomain());
            //domain设置域名,shortLinkPageRespDTO.getDomain()=nurl.ink:8002
            return shortLinkPageRespDTO;
            //最终返回一个分页结果（IPage<ShortLinkPageRespDTO>），包含了回收站中所有短链接的信息
        });
    }

    @Override
    public void recoverRecycleBin(RecoverRecycleBinReqDTO requestParam) {
//        requestParam进来是fullShortUrl和gid
        System.out.println(RED+"这里是:recoverRecycleBin"+RESET);
        LambdaUpdateWrapper<ShortLinkDO> updateWrapper = Wrappers.lambdaUpdate(ShortLinkDO.class)
                .eq(ShortLinkDO::getGid, requestParam.getGid())
                .eq(ShortLinkDO::getFullShortUrl, requestParam.getFullShortUrl())
                .eq(ShortLinkDO::getEnableStatus, 1)
                //1为被删除
                .eq(ShortLinkDO::getDelFlag, 0);
        //0为未被完全删除
        ShortLinkDO shortLinkDO = ShortLinkDO.builder()
                .enableStatus(0)
                //0为未被删除
                .build();
        baseMapper.update(shortLinkDO, updateWrapper);
        //数据库更新操作，将符合 updateWrapper 条件的记录的 enableStatus 更新为 0，即表示该短链接被恢复为可用状态
        stringRedisTemplate.delete(String.format(RedisKeyConstant.GOTO_IS_NULL_SHORT_LINK_KEY, requestParam.getFullShortUrl()));
        //"short-link:is-null:goto:%s"
        //在恢复短链接（从回收站恢复）之后，通过删除 Redis 缓存中的对应条目，确保系统中短链接的状态是最新的，
        // 并且避免客户端或系统访问到过时的缓存数据。这种做法有助于维持缓存和数据库之间的一致性。
    }

    @Override
    public void removeRecycleBin(RemoveRecycleBinReqDTO requestParam) {
        //从回收站里删除短链接
        System.out.println(RED+"这里是:removeRecycleBin"+RESET);
        LambdaUpdateWrapper<ShortLinkDO> updateWrapper = Wrappers.lambdaUpdate(ShortLinkDO.class)
                .eq(ShortLinkDO::getGid, requestParam.getGid())
                .eq(ShortLinkDO::getFullShortUrl, requestParam.getFullShortUrl())
                .eq(ShortLinkDO::getEnableStatus, 1)
                .eq(ShortLinkDO::getDelTime, 0L)
                //检查 ShortLinkDO 对象中的删除时间 (delTime) 是否为 0L，即是否表示该记录尚未被删除
                .eq(ShortLinkDO::getDelFlag, 0);
        ShortLinkDO updateShortLinkDO = ShortLinkDO.builder()
                .delTime(System.currentTimeMillis())
                .build();
        updateShortLinkDO.setDelFlag(1);
        //设置为已被完全删除
        baseMapper.update(updateShortLinkDO, updateWrapper);
        //执行数据库更新操作，将符合 updateWrapper 条件的记录的 delTime 更新为当前时间戳，即表示该短链接被标记为已删除
    }
}
